; void normalizar_local_asm (
; 	unsigned char *src,		RDI
; 	unsigned char *dst,		RSI
; 	int m,					EDX
; 	int n,					ECX
; 	int row_size			R8D
; );

global normalizar_local_asm

normalizar_local_asm:
	mov rax, rsp
	push rbp
	mov rbp, rsp
	push rbx
	push r12
	push r13
	push r14
	push r15
	
	xor r12, r12 	;Contador filas
 		
.cicloFilas:	
	xor r13, r13	;Contador columnas
	xor rax, rax	;Marcador indicando que estamos procesando las ultimas 16 columnas.

.cicloColumnas:		
	mov rbx, r12 	;rbx = j
	imul ebx, r8d	;rbx = j*row_size
	add rbx, r13	;rbx = j*row_size + i
					;avanzamos de a 8 para retomar el ultimo pixel
	
	cmp qword r12, 0
	je .primerUltimaFilas ;validamos si estamos en la primer fila
	mov r10d, edx
	sub r10d, 1
	cmp r12d, r10d
	je .primerUltimaFilas ;validamos si estamos en la ultima fila
	
	sub ebx, r8d ;fila anterior
	movdqu xmm1, [rdi+rbx] ; copiamos 16 pixeles de la fila anterior a xmm1.
	add ebx, r8d ;fila actual
	movdqu xmm2, [rdi+rbx] ; copiamos 16 pixeles de la fila actual a xmm2.
	add ebx, r8d ;fila siguiente
	movdqu xmm3, [rdi+rbx] ; copiamos 16 pixeles de la fila siguiente a xmm3.
	sub ebx, r8d ;fila actual
	
	movdqu xmm0, xmm2	;copiamos la fila actual a xmm0
	
	cmp r13d, 0
	je .esPrimerColumna ;validamos si se trata de la primer columna
	
	mov r10d, ecx
	sub r10d, 16 ; nos fijamos si son las ultimas 16 columnas
	cmp r13d, r10d
	je .ultimas16Columnas
	jmp .columnasDelMedio
	
.esPrimerColumna:
	movq [rsi+rbx], xmm0 ;copio la primer columna (el resto lo copio pero despues lo sobreescribe)
	jmp .columnasDelMedio ;ya copiamos la primer columna, vamos a trabajar normal.
	
.ultimas16Columnas:
	add rax, 1 ; seteamos que es son las ultimas columnas.
	movdqu xmm11, xmm1
	movdqu xmm12, xmm2
	movdqu xmm13, xmm3 ; copias de las filas originales

.columnasDelMedio:
	add ebx, 1 ;la primer columna que pegamos es la segunda que leemos.
	psrldq xmm0, 1 ;xmm0 = 1|2|3|...|15|x es la fila actual (sacamos la primer columna (0) que no nos sirve)
	
;Calculo de maximos y minimos
	movdqu xmm4, xmm1
	movdqu xmm5, xmm2
	movdqu xmm6, xmm3	;Copiamos para utilizarlos en el calculo del minimo
	
;Calculo de maximos
	pmaxub xmm1, xmm2
	pmaxub xmm1, xmm3	; xmm1 = maximo entre xmm1, xmm2 y xmm3 byte a byte
	; xmm1 = max(0s) max(1s) max(2s) max(3s) | max(4s) max(5s) max(6s) max(7s)
	; | max(8s) max(9s) max(10s) max(11s) | max(12s) max(13s) max(14s) max(15s)
	
	movdqu xmm2, xmm1
	psrldq xmm2, 1		; xmm2 = xmm1 shifteado a la derecha
	; xmm2 = max(1s) max(2s) max(3s) max(4s) | max(5s) max(6s) max(7s) max(8s)
	; | max(9s) max(10s) max(11s) max(12s) | max(13s) max(14s) max(15s) 0
	pmaxub xmm1, xmm2
	; xmm1 = max(0s,1s) max(1s,2s) max(2s,3s) max(3s,4s)
	; | max(4s,5s) max(5s,6s) max(6s,7s) max(7s,8s)
	; | max(8s,9s) max(9s,10s) max(10s,11s) max(11s,12s)
	; | max(12s,13s) max(13s,14s) max(14s,15s) max(15s)
	
	movdqu xmm2, xmm1
	psrldq xmm2, 1		; xmm2 = xmm1 shifteado a la derecha
	; xmm2 = max(1s,2s) max(2s,3s) max(3s,4s) max(4s,5s)
	; | max(5s,6s) max(6s,7s) max(7s,8s) max(8s,9s)
	; | max(9s,10s) max(10s,11s) max(11s,12s) max(12s,13s)
	; | max(13s,14s) max(14s,15s) max(15s) 0
	pmaxub xmm1, xmm2 ;tenemos los maximos verticales
	; xmm1 = max(0s,1s,2s) max(1s,2s,3s) max(2s,3s,4s) max(3s,4s,5s)
	; | max(4s,5s,6s) max(5s,6s,7s) max(6s,7s,8s) max(7s,8s,9s)
	; | max(8s,9s,10s) max(9s,10s,11s) max(10s,11s,12s) max(11s,12s,13s)
	; | max(12s,13s,14s) max(13s,14s,15s) max(14s,15s) max(15s)
		
;Calculo de minimos
	pminub xmm4, xmm5
	pminub xmm4, xmm6	; xmm4 = minimo entre xmm4, xmm5 y xmm6 byte a byte
	; xmm4 = min(0s) min(1s) min(2s) min(3s) | min(4s) min(5s) min(6s) min(7s)
	; | min(8s) min(9s) min(10s) min(11s) | min(12s) min(13s) min(14s) min(15s)
	
	movdqu xmm5, xmm4
	psrldq xmm5, 1		; xmm5 = xmm4 shifteado a la derecha
	; xmm5 = min(1s) min(2s) min(3s) min(4s) | min(5s) min(6s) min(7s) min(8s)
	; | min(9s) min(10s) min(11s) min(12s) | min(13s) min(14s) min(15s) 0
	pminub xmm4, xmm5
	; xmm4 = min(0s,1s) min(1s,2s) min(2s,3s) min(3s,4s)
	; | min(4s,5s) min(5s,6s) min(6s,7s) min(7s,8s)
	; | min(8s,9s) min(9s,10s) min(10s,11s) min(11s,12s)
	; | min(12s,13s) min(13s,14s) min(14s,15s) 0
	
	movdqu xmm5, xmm4
	psrldq xmm5, 1		; xmm5 = xmm4 shifteado a la derecha
	; xmm5 = min(1s,2s) min(2s,3s) min(3s,4s) min(4s,5s)
	; | min(5s,6s) min(6s,7s) min(7s,8s) min(8s,9s)
	; | min(9s,10s) min(10s,11s) min(11s,12s) min(12s,13s)
	; | min(13s,14s) min(14s,15s) 0 0
	pminub xmm4, xmm5 ;tenemos los minimos verticales
	; xmm4 = min(0s,1s,2s) min(1s,2s,3s) min(2s,3s,4s) min(3s,4s,5s)
	; | min(4s,5s,6s) min(5s,6s,7s) min(6s,7s,8s) min(7s,8s,9s)
	; | min(8s,9s,10s) min(9s,10s,11s) min(10s,11s,12s) min(11s,12s,13s)
	; | min(12s,13s,14s) min(13s,14s,15s) 0 0
	
;Dividimos la fila actual por el maximo
	
;Convertimos a DW la fila actual
	movdqu xmm5, xmm0 ; Tenemos una copia de la fila actual
					;xmm5 = 1 2 3 4 | 5 6 7 8 | 9 10 11 12 | 13 14 15 0
	pmovzxbd xmm5, xmm5	;Convertimos a DW los 4 primeros bytes extendiendo con cero de la fila actual
					;xmm5 = 1 | 2 | 3 | 4
	
	movdqu xmm6, xmm0 ; Tenemos una copia de la fila actual
					;xmm6 = 1 2 3 4 | 5 6 7 8 | 9 10 11 12 | 13 14 15 0
	psrldq xmm6, 4	  ; Ponemos los segundos 4 bytes en la parte mas baja
					;xmm6 = 5 6 7 8 | 9 10 11 12 | 13 14 15 0 | 0 0 0 0
	pmovzxbd xmm6, xmm6	;Convertimos a DW los 4 segundos bytes extendiendo con cero de la fila actual
					;xmm6 = 5 | 6 | 7 | 8
					
;Convertimos a DW los maximos
	movdqu xmm7, xmm1 ; Tenemos una copia de los maximos
	pmovzxbd xmm7, xmm7	;Convertimos a DW los 4 primeros bytes extendiendo con cero de los maximos
	; xmm7 = max(0s,1s,2s) | max(1s,2s,3s) | max(2s,3s,4s) | max(3s,4s,5s)
	
	movdqu xmm8, xmm1 ; Tenemos una copia de los maximos
	psrldq xmm8, 4	  ; Ponemos los segundos 4 bytes en la parte mas baja
	; xmm8 = max(4s,5s,6s) max(5s,6s,7s) max(6s,7s,8s) max(7s,8s,9s)
	; | max(8s,9s,10s) max(9s,10s,11s) max(10s,11s,12s) max(11s,12s,13s)
	; | max(12s,13s,14s) max(13s,14s,15s) max(14s,15s) max(15s)
	; | 0 0 0 0
	pmovzxbd xmm8, xmm8	;Convertimos a DW los 4 segundos bytes extendiendo con cero de los maximos
	; xmm8 = max(4s,5s,6s) | max(5s,6s,7s) | max(6s,7s,8s) | max(7s,8s,9s)
	
;Convertimos a W los minimos
	movdqu xmm9, xmm4 ; Tenemos una copia de los minimos
	pmovzxbw xmm9, xmm9	;Convertimos a W los 8 primeros bytes extendiendo con cero de los minimos
	; xmm9 = min(0s,1s,2s) min(1s,2s,3s) | min(2s,3s,4s) min(3s,4s,5s)
	; | min(4s,5s,6s) min(5s,6s,7s) | min(6s,7s,8s) min(7s,8s,9s)
	
;Convertimos la fila actual y los maximos a float
	cvtdq2ps xmm5, xmm5
	cvtdq2ps xmm6, xmm6 ; convertimos la fila actual a float
	cvtdq2ps xmm7, xmm7
	cvtdq2ps xmm8, xmm8 ; convertimos los maximos a float
	
;Dividimos la fila actual por el maximo (I/Max) en dos partes
	divps xmm5, xmm7
	;xmm5 = 1/max(0s,1s,2s) | 2/max(1s,2s,3s) | 3/max(2s,3s,4s) | 4/max(3s,4s,5s)
	divps xmm6, xmm8
	;xmm6 = 5/max(4s,5s,6s) | 6/max(5s,6s,7s) | 7/max(6s,7s,8s) | 8/max(7s,8s,9s)
	
;Convertimos a enteros los resultados
	cvtps2dq xmm5, xmm5
	cvtps2dq xmm6, xmm6	;Convertimos a enteros los resultados
	
;Convertimos a W
	packusdw xmm5, xmm6
	;xmm5 = 1/max(0s,1s,2s) 2/max(1s,2s,3s) | 3/max(2s,3s,4s) 4/max(3s,4s,5s)
	; | 5/max(4s,5s,6s) 6/max(5s,6s,7s) | 7/max(6s,7s,8s) 8/max(7s,8s,9s)
	
;Sumamos los minimos
	paddw xmm5, xmm9
	;xmm5 = 1/max(0s,1s,2s)+min(0s,1s,2s) 2/max(1s,2s,3s)+min(1s,2s,3s)
	; | 3/max(2s,3s,4s)+min(2s,3s,4s) 4/max(3s,4s,5s)+min(3s,4s,5s)
	; | 5/max(4s,5s,6s)+min(4s,5s,6s) 6/max(5s,6s,7s)+min(5s,6s,7s)
	; | 7/max(6s,7s,8s)+min(6s,7s,8s) 8/max(7s,8s,9s)+(7s,8s,9s)
		
;Convertimos a Byte
	packuswb xmm5, xmm5
	;xmm5 = 1/max(0s,1s,2s)+min(0s,1s,2s) 2/max(1s,2s,3s)+min(1s,2s,3s)
	; 3/max(2s,3s,4s)+min(2s,3s,4s) 4/max(3s,4s,5s)+min(3s,4s,5s)
	; | 5/max(4s,5s,6s)+min(4s,5s,6s) 6/max(5s,6s,7s)+min(5s,6s,7s)
	; 7/max(6s,7s,8s)+min(6s,7s,8s) 8/max(7s,8s,9s)+(7s,8s,9s)
	; | 0 0 0 0 | 0 0 0 0

	movdqu xmm0, xmm5 ; copiamos a xmm0
	
	movq [rsi+rbx], xmm0 ; copiamos los 8 pixeles de xmm0 a la imagen destino.
	
	cmp rax, 0
	je .avanzarColumnas ;si no son las ultimas columnas iteramos
	
.procesarUltimasColumnas;
	movdqu xmm1, xmm11
	movdqu xmm2, xmm12
	movdqu xmm3, xmm13 ; Copiamos las tres filas originales.
	
	psrldq xmm1, 6
	psrldq xmm2, 6
	psrldq xmm3, 6 ; Shifteamos para procesar los pixeles que queremos.
; 0 1 2 3 | 4 5 6 7 | 8 9 10 11 | 12 13 14 15 -->
;xmm2 = 6 7 8 9 | 10 11 12 13 | 14 15 0 0 | 0 0 0 0

	movdqu xmm0, xmm2	;copiamos la fila actual
	
	add ebx, 7 ; ya habiamos incrementado en 1 ebx para pegar a partir del 1.
				; lo incrementamos para pegar a partir del 8.
	psrldq xmm0, 1
	;xmm0 = 7 8 9 10 | 11 12 13 14 | 15 0 0 0 | 0 0 0 0 es la fila actual
	; (sacamos la primer columna (6) que no nos sirve)

;Calculo maximos y minimos
	movdqu xmm4, xmm1
	movdqu xmm5, xmm2
	movdqu xmm6, xmm3	; Copiamos para utilizarlos en el calculo del minimo
	
;Calculo de maximos
	pmaxub xmm1, xmm2
	pmaxub xmm1, xmm3	; xmm1 = maximo entre xmm1, xmm2 y xmm3 byte a byte
	; xmm1 = max(6s) max(7s) max(8s) max(9s) | max(10s) max(11s) max(12s) max(13s)
	; | max(14s) max(15s) 0 0 | 0 0 0 0
	
	movdqu xmm2, xmm1
	psrldq xmm2, 1		; xmm2 = xmm1 shifteado a la derecha
	; xmm2 = max(7s) max(8s) max(9s) max(10s) | max(11s) max(12s) max(13s) max(14s)
	; | max(15s) 0 0 0 | 0 0 0 0
	pmaxub xmm1, xmm2
	; xmm1 = max(6s,7s) max(7s,8s) max(8s,9s) max(9s,10s)
	; | max(10s,11s) max(11s,12s) max(12s,13s) max(13s,14s)
	; | max(14s,15s) 0 0 0 | 0 0 0 0
	
	movdqu xmm2, xmm1
	psrldq xmm2, 1		; xmm2 = xmm1 shifteado a la derecha
	; xmm2 = max(7s,8s) max(8s,9s) max(9s,10s) max(10s,11s)
	; | max(11s,12s) max(12s,13s) max(13s,14s) max(14s,15s)
	; | 0 0 0 0 | 0 0 0 0
	pmaxub xmm1, xmm2
	; xmm1 = max(6s,7s,8s) max(7s,8s,9s) max(8s,9s,10s) max(9s,10s,11s)
	; | max(10s,11s,12s) max(11s,12s,13s) max(12s,13s,14s) max(13s,14s,15s)
	; | 0 0 0 0 | 0 0 0 0
	
;Calculo minimos	
	pminub xmm4, xmm5
	pminub xmm4, xmm6	; xmm4 = minimo entre xmm4, xmm5 y xmm6 byte a byte
	; xmm4 = min(6s) min(7s) min(8s) min(9s) | min(10s) min(11s) min(12s) min(13s)
	; | min(14s) min(15s) 0 0 | 0 0 0 0
	
	movdqu xmm5, xmm4
	psrldq xmm5, 1		; xmm5 = xmm4 shifteado a la derecha
	; xmm5 = min(7s) min(8s) min(9s) min(10s) | min(11s) min(12s) min(13s) min(14s)
	; | min(15s) 0 0 0 | 0 0 0 0
	pminub xmm4, xmm5
	; xmm4 = min(6s,7s) min(7s,8s) min(8s,9s) min(9s,10s)
	; | min(10s,11s) min(11s,12s) min(12s,13s) min(13s,14s)
	; | min(14s,15s) 0 0 0 | 0 0 0 0
	
	movdqu xmm5, xmm4
	psrldq xmm5, 1		; xmm5 = xmm4 shifteado a la derecha
	; xmm5 = min(7s,8s) min(8s,9s) min(9s,10s) min(10s,11s)
	; | min(11s,12s) min(12s,13s) min(13s,14s) min(14s,15s)
	; | 0 0 0 0 | 0 0 0 0
	pminub xmm4, xmm5
	; xmm4 = min(6s,7s,8s) min(7s,8s,9s) min(8s,9s,10s) min(9s,10s,11s)
	; | min(10s,11s,12s) min(11s,12s,13s) min(12s,13s,14s) min(13s,14s,15s)
	; | 0 0 0 0 | 0 0 0 0
	
;Dividimos la fila actual por el maximo

;Convertimos a DW la fila actual
	movdqu xmm5, xmm0 ; Tenemos una copia de la fila actual
					;xmm5 = 7 8 9 10 | 11 12 13 14 | 15 0 0 0 | 0 0 0 0
	pmovzxbd xmm5, xmm5	;Convertimos a DW los 4 primeros bytes extendiendo con cero de la fila actual
					;xmm5 = 7 | 8 | 9 | 10
	
	movdqu xmm6, xmm0 ; Tenemos una copia de la fila actual
					;xmm6 = 7 8 9 10 | 11 12 13 14 | 15 0 0 0 | 0 0 0 0
	psrldq xmm6, 4	  ; Ponemos los segundos 4 bytes en la parte mas baja
					;xmm6 = 11 12 13 14 | 15 0 0 0 | 0 0 0 0 | 0 0 0 0
	pmovzxbd xmm6, xmm6	;Convertimos a DW los 4 segundos bytes extendiendo con cero de la fila actual
					;xmm6 = 11 | 12 | 13 | 14
	
;Convertimos a DW los maximos
	movdqu xmm7, xmm1 ; Tenemos una copia de los maximos
	pmovzxbd xmm7, xmm7	;Convertimos a DW los 4 primeros bytes extendiendo con cero de los maximos
	; xmm7 = max(6s,7s,8s) | max(7s,8s,9s) | max(8s,9s,10s) | max(9s,10s,11s)
	
	movdqu xmm8, xmm1 ; Tenemos una copia de los maximos
	psrldq xmm8, 4	  ; Ponemos los segundos 4 bytes en la parte mas baja
	; xmm8 = max(10s,11s,12s) max(11s,12s,13s) max(12s,13s,14s) max(13s,14s,15s)
	; | 0 0 0 0 | 0 0 0 0 | 0 0 0 0
	pmovzxbd xmm8, xmm8	;Convertimos a DW los 4 segundos bytes extendiendo con cero de los maximos
	; xmm8 = max(10s,11s,12s) | max(11s,12s,13s) | max(12s,13s,14s) | max(13s,14s,15s)
	
;Convertimos a W los minimos
	movdqu xmm9, xmm4 ; Tenemos una copia de los minimos
	pmovzxbw xmm9, xmm9	;Convertimos a W los 8 primeros bytes extendiendo con cero de los minimos
	; xmm9 = min(6s,7s,8s) min(7s,8s,9s) | min(8s,9s,10s) min(9s,10s,11s) |
	; | min(10s,11s,12s) min(11s,12s,13s) | min(12s,13s,14s) min(13s,14s,15s)
		
;Convertimos la fila actual y los maximos a float
	cvtdq2ps xmm5, xmm5
	cvtdq2ps xmm6, xmm6 ; convertimos la fila actual a float
	cvtdq2ps xmm7, xmm7
	cvtdq2ps xmm8, xmm8 ; convertimos los maximos a float
	
;Dividimos la fila actual por el maximo (I/Max) en dos partes
	divps xmm5, xmm7
	;xmm5 = 7/max(6s,7s,8s) | 8/max(7s,8s,9s) | 9/max(8s,9s,10s) | 10/max(9s,10s,11s)
	divps xmm6, xmm8
	;xmm6 = 11/max(10s,11s,12s) | 12/max(11s,12s,13s) | 13/max(12s,13s,14s) | 14/max(13s,14s,15s)
		
;Convertimos a enteros los resultados
	cvtps2dq xmm5, xmm5
	cvtps2dq xmm6, xmm6	;Convertimos a enteros los resultados
	
;Convertimos a W
	packusdw xmm5, xmm6
	;xmm5 = 7/max(6s,7s,8s) 8/max(7s,8s,9s) | 9/max(8s,9s,10s) 10/max(9s,10s,11s)
	; | 11/max(10s,11s,12s) 12/max(11s,12s,13s) | 13/max(12s,13s,14s) 14/max(13s,14s,15s)
	
;Sumamos los minimos
	paddw xmm5, xmm9
	;xmm5 = 7/max(6s,7s,8s)+min(6s,7s,8s) 8/max(7s,8s,9s)+min(7s,8s,9s)
	; | 9/max(8s,9s,10s)+min(8s,9s,10s) 10/max(9s,10s,11s)+min(9s,10s,11s)
	; | 11/max(10s,11s,12s)+min(10s,11s,12s) 12/max(11s,12s,13s)+min(11s,12s,13s)
	; | 13/max(12s,13s,14s)+min(12s,13s,14s) 14/max(13s,14s,15s)+min(13s,14s,15s)
	
;Convertimos a Byte
	packuswb xmm5, xmm5
	;xmm5 = 7/max(6s,7s,8s)+min(6s,7s,8s) 8/max(7s,8s,9s)+min(7s,8s,9s)
	; 9/max(8s,9s,10s)+min(8s,9s,10s) 10/max(9s,10s,11s)+min(9s,10s,11s)
	; | 11/max(10s,11s,12s)+min(10s,11s,12s) 12/max(11s,12s,13s)+min(11s,12s,13s)
	; 13/max(12s,13s,14s)+min(12s,13s,14s) 14/max(13s,14s,15s)+min(13s,14s,15s)
	; | 0 0 0 0 | 0 0 0 0

	movdqu xmm0, xmm5 ; copiamos a xmm0

;Hacemos un shift a la derecha para tener lugar para la ultima columna
	psrldq xmm0, 1
	;xmm0 = 8/max(7s,8s,9s)+min(7s,8s,9s) 9/max(8s,9s,10s)+min(8s,9s,10s)
	; 10/max(9s,10s,11s)+min(9s,10s,11s) 11/max(10s,11s,12s)+min(10s,11s,12s)
	; | 12/max(11s,12s,13s)+min(11s,12s,13s) 13/max(12s,13s,14s)+min(12s,13s,14s)
	; 14/max(13s,14s,15s)+min(13s,14s,15s) 0
	; | 0 0 0 0 | 0 0 0 0
	
;Recuperamos el valor de la ultima columna
	movdqu xmm1, xmm12
	;xmm1 = 0 1 2 3 | 4 5 6 7 | 8 9 10 11 | 12 13 14 15
	psrldq xmm1, 15 ; desplazamos el valor al primer lugar para limpiar
	;xmm1 = 15 0 0 0 | 0 0 0 0 | 0 0 0 0 | 0 0 0 0
	pslldq xmm1, 7 ; desplazamos el valor al 8vo lugar
	;xmm1 = 0 0 0 0 | 0 0 0 15 | 0 0 0 0 | 0 0 0 0

;Agregamos el valor de la ultima columna a xmm0
	paddb xmm0, xmm1
	;xmm0 = 8/max(7s,8s,9s)+min(7s,8s,9s) 9/max(8s,9s,10s)+min(8s,9s,10s)
	; 10/max(9s,10s,11s)+min(9s,10s,11s) 11/max(10s,11s,12s)+min(10s,11s,12s)
	; | 12/max(11s,12s,13s)+min(11s,12s,13s) 13/max(12s,13s,14s)+min(12s,13s,14s)
	; 14/max(13s,14s,15s)+min(13s,14s,15s) 15
	; | 0 0 0 0 | 0 0 0 0
		
	movq [rsi+rbx], xmm0 ; copiamos los 8 pixeles de xmm0 a la imagen destino.

	jmp .avanzarColumnas
	
.primerUltimaFilas: ; el ciclo nos garantiza que siempre vamos a leer bien 16 pixeles.
	movdqu xmm0, [rdi+rbx] ; copiamos 16 pixeles de la imagen origen a xmm0.
	movdqu [rsi+rbx], xmm0 ; copiamos los 16 pixeles que hay en xmm0 a la imagen destino.
	
.avanzarColumnas:
	lea r10, [r13+16] ;validamos si acabamos de procesar las ultimas 16 columnas
	cmp r10d, ecx
	je .avanzarFilas ;si llegamos al final con el loop anterior, pasamos a la siguiente fila
	
	add r13, 8 ; avanzamos de a 8 para retomar el ultimo pixel
.cuantoAtras:
	lea r10, [r13+16]	; tenemos que poder leer 16 pixeles
	cmp r10d, ecx
	jle .cicloColumnas	; si hay 16 pixeles para leer, ciclamos
	sub r13, 1			;si no, nos movemos hacia atras.
	jmp .cuantoAtras	;Con el ciclo calculamos cuanto tenemos que ir para atras para agarrar justo 8
	
.avanzarFilas:
	add r12, 1	; vamos a la siguiente fila
	cmp r12d, edx	
	jl .cicloFilas ; nos quedan filas por recortar
	
.fin:
	pop r15
	pop r14
	pop r13
	pop r12
	pop rbx
	pop rbp
	ret
